home *** CD-ROM | disk | FTP | other *** search
/ PC Media 22 / PC MEDIA CD22.iso / share / prog / spm220e / modem.pas < prev    next >
Pascal/Delphi Source File  |  1995-09-13  |  9KB  |  247 lines

  1. {
  2. ╔═════════════════════════════════════════════════════════════════════════════╗
  3. ║ NAME      : MODEM.PAS                                                       ║
  4. ║ FUNCTION  : Library to control the used (TeleTex OR HAYES) modem.           ║
  5. ║ REMARKS   : ■ To activate this unit clock interrupt, you have to include the║
  6. ║           : following lines in the main routine:                            ║
  7. ║           :         GetIntVec($1C,Int1CSave);                               ║
  8. ║           :         SetIntVec($1C,Addr(Check_HModem_State));                ║
  9. ║           : Do NOT forget to disactivate it before terminating the program: ║
  10. ║           :         SetIntVec($1C,Int1CSave);                               ║
  11. ║           : This interrupt will up-date the "connected" variable at each    ║
  12. ║           : second for an HAYES modem. It will also up-date the "C" signal  ║
  13. ║           : into screen to inform the user that he is connected ("ShowCorF" ║
  14. ║           : has to be set TRUE for this...).                                ║
  15. ║           : Please, note that "HayesModemState" and "Check_HModem_State"    ║
  16. ║           : can't be used to check the connect status of the Minitel:       ║
  17. ║           : The connect status of it must be interpreted by the VideoTex    ║
  18. ║           : transcoding procedure...                                        ║
  19. ║ COPYRIGHT : HETRU Fabrice 1991-1995.                                        ║
  20. ╚═════════════════════════════════════════════════════════════════════════════╝
  21. }
  22.  
  23.  
  24.  
  25. UNIT Modem;
  26.  
  27.  
  28.  
  29. interface
  30.  
  31. USES Crt,Dos,StarIntf;
  32.  
  33. TYPE
  34.   CmdeStr = STRING[20] ;
  35.  
  36. CONST
  37.   (* Modem type in use: MINITEL ou HAYES ? *)
  38.   TlTex     = 0 ;
  39.   Hayes     = 1 ;
  40.   (* Command codes to send to the modem.   *)
  41.   Generique = 0 ;
  42.   InitMod   = 1 ;
  43.   Connect   = 2 ;
  44.   Appel     = 3 ;
  45.   Raccroch  = 4 ;
  46.   ConnexFin = 5 ;
  47.   (* Screen RAM Segment.                   *)
  48.   seg_ecran  : WORD = $B000 ;
  49.  
  50. VAR
  51.   ModemUsed   : SHORTINT  ;    (* Modem type in use: Hayes/Minitel ?         *)
  52.   DTR_Cmde    : BOOLEAN   ;    (* Is DTR used as a command prefix ?          *)
  53.   HAYESPrefix : STRING[3] ;    (* Command prefix for the HAYES modem.        *)
  54.   PulseDial   : BOOLEAN   ;    (* Pulses call ? (or Frequency calls ?).      *)
  55.   connected   : BOOLEAN   ;    (* Connected status flag.                     *)
  56.   Show_CorF   : BOOLEAN   ;    (* Write (or not) the connect status on screen*)
  57.   Int1CSave   : POINTER   ;    (* Back-up for the last interrupt vector...   *)
  58.  
  59. PROCEDURE CmdeToModem(TypCmde: BYTE;DataCmde: CmdeStr);
  60.                                          { HAYES and TlTex commands maker.    }
  61. PROCEDURE HayesModemState;               { Up-dates the connect status.       }
  62. PROCEDURE Check_HModem_State; INTERRUPT; { Clock interrupt to check the con-  }
  63.                                          { -nect status...                    }
  64.  
  65.  
  66.  
  67. implementation
  68.  
  69. TYPE
  70.   Vecteur = RECORD
  71.               Offset  : WORD ;
  72.               Segment : WORD ;
  73.             END;
  74.  
  75.  
  76. CONST
  77.   OldIntrp1C : Vecteur = (Offset:0;Segment:0) ;
  78.  
  79.  
  80. VAR
  81.   reg88        : Registers ;
  82.   ItClk_active : BOOLEAN   ;
  83.  
  84.  
  85. PROCEDURE Beep(Freq, Tempo: WORD);
  86.   BEGIN
  87.     Sound(Freq);
  88.     Delay(Tempo);
  89.     NoSound
  90.   END;
  91.  
  92.  
  93. PROCEDURE CmdeToModem(TypCmde: BYTE;DataCmde: CmdeStr);
  94.   VAR
  95.     Chaine_CMDE   : CmdeStr ;
  96.     Sended,
  97.     Nb_transmited : WORD    ;
  98.   BEGIN
  99.     Chaine_CMDE := '';
  100.     CASE ModemUsed OF
  101.       TlTex: BEGIN
  102.           CASE TypCmde OF
  103.             Generique: Chaine_CMDE := #$1B+#$39+#$67;
  104.             InitMod: Chaine_CMDE := '';
  105.             Connect: Chaine_CMDE := #$1B+#$39+#$68;
  106.             Appel: Chaine_CMDE := '';
  107.             Raccroch: Chaine_CMDE := #$1B+#$39+#$67;
  108.             ConnexFin: IF connected THEN Chaine_CMDE := #$13+#$49
  109.                          ELSE Chaine_CMDE := #$1B+#$39+#$68
  110.           END;
  111.           IF Length(Chaine_CMDE)>0 THEN
  112.             IF WriteSerie(Chaine_CMDE[1],Length(Chaine_CMDE),Nb_transmited)<>0
  113.               THEN Beep(500,500)
  114.         END;
  115.       Hayes: BEGIN
  116.           CASE TypCmde OF
  117.             Generique: Chaine_CMDE := Chaine_CMDE + DataCmde;
  118.             InitMod:
  119.               IF DTR_Cmde THEN Chaine_CMDE := 'AT Z0 &D1 X0 V2 B2'
  120.                 ELSE Chaine_CMDE := Chaine_CMDE + 'AT Z0 X0 V2 B2';
  121.             Connect: Chaine_CMDE := Chaine_CMDE + 'ATD';
  122.             Appel: IF connected OR (DataCmde='') THEN Chaine_CMDE := ''
  123.                      ELSE
  124.                      BEGIN
  125.                        Chaine_CMDE := Chaine_CMDE + 'ATD' ;
  126.                        IF PulseDIAL THEN Chaine_CMDE := Chaine_CMDE + 'P'
  127.                          ELSE Chaine_CMDE := Chaine_CMDE + 'T';
  128.                        Chaine_CMDE := Chaine_CMDE + DataCmde
  129.                      END;
  130.             Raccroch: Chaine_CMDE := Chaine_CMDE + 'ATH0';
  131.             ConnexFin: IF connected THEN Chaine_CMDE := Chaine_CMDE + 'ATH0'
  132.                          ELSE Chaine_CMDE := Chaine_CMDE + 'ATD'
  133.           END;
  134.           IF Length(Chaine_CMDE)>0 THEN
  135.           BEGIN
  136.             IF NOT DTR_Cmde THEN
  137.             BEGIN
  138.               IF connected THEN
  139.               BEGIN
  140.                 Delay(1000);
  141.                 Sended:=WriteCmde(HAYESPrefix[1],Length(HAYESPrefix),DTR_Cmde);
  142.                 IF Sended=0 THEN Delay(1000);
  143.               END
  144.               ELSE Sended := 0;
  145.             END
  146.             ELSE Sended := 0;
  147.             IF Sended=0 THEN
  148.             BEGIN
  149.               Chaine_CMDE := Chaine_CMDE + #$0D;
  150.               IF WriteCmde(Chaine_CMDE[1],Length(Chaine_CMDE),DTR_Cmde)<>0
  151.                 THEN Beep(500,500);
  152.               IF connected THEN
  153.               BEGIN
  154.                 Delay(1200);
  155.                 Chaine_Cmde := 'ATO' + #$0D;
  156.                 Sended:=WriteCmde(Chaine_CMDE[1],Length(Chaine_CMDE),FALSE);
  157.               END
  158.             END;
  159.           END
  160.         END;
  161.     END
  162.   END;
  163.  
  164.  
  165. PROCEDURE HayesModemState;
  166.   VAR
  167.     voie : CHAR    ;
  168.     x    : BOOLEAN ;
  169.     xx   : BYTE    ;
  170.   BEGIN
  171.     IF ModemUsed=Hayes THEN
  172.       Etat_du_modem(voie,x,x,x,connected,x,xx,xx,xx,xx)
  173.   END;
  174.  
  175.  
  176. {$F+}
  177. PROCEDURE Check_HModem_State;
  178.   VAR
  179.     compteur : BYTE ;
  180.   BEGIN
  181.     (* Up-date at each second... *)
  182.     Inc(compteur);
  183.     IF (compteur>=$12) AND NOT ItClk_active THEN
  184.     BEGIN
  185.       (* No multiple entrance in this area ! *)
  186.       ItClk_active := TRUE;
  187.  
  188.       (* 8259 and CPU acquittance to allow the serial receipts... *)
  189.       Inline($50/              (* push ax     *)
  190.              $B0/$20/          (* mov  al,20h *)
  191.              $E6/$20/          (* out  20h,al *)
  192.              $58);             (* pop  ax     *)
  193.       Inline($FB);             (* sti         *)
  194.  
  195.       (* Checking the connect status. *)
  196.       HayesModemState;
  197.  
  198.       (* Writting the "C" or "F" alert into screen. *)
  199.       IF Show_CorF THEN
  200.       BEGIN
  201.         IF connected THEN
  202.         BEGIN
  203.           IF MEM[$40:$49] IN [2,3,7] THEN
  204.             MEMW[seg_ecran:158] := $7043
  205.           ELSE MEMW[seg_ecran:76] := $7043
  206.         END
  207.         ELSE
  208.         BEGIN
  209.           IF MEM[$40:$49] IN [2,3,7] THEN
  210.             MEMW[seg_ecran:158] := $7046
  211.           ELSE MEMW[seg_ecran:76] := $7046
  212.         END;
  213.       END;
  214.  
  215.       (* That's the end of our clock interrupt. *)
  216.       ItClk_active := FALSE;
  217.       compteur := 0
  218.     END;
  219.  
  220.     (* Call to the previous clock interrupt *)
  221.     Inline($9C/                (* pushf                            *)
  222.            $FF/$1E/OldIntrp1C) (* call far dword ptr ds:OldIntrp1C *)
  223.   END;
  224. {$F-}
  225.  
  226.  
  227. BEGIN
  228.   ModemUsed := Hayes;               (* HAYES Modem in use...                 *)
  229.   DTR_Cmde := TRUE;                 (* We want to use DTR as a Cmde indicator*)
  230.   HAYESPrefix := '+++';             (* That's the default HAYES Cmde prefix. *)
  231.   PulseDial := TRUE;                (* Pulses call in use.                   *)
  232.   connected := FALSE;               (* We are supposed not to be connected ! *)
  233.   Show_CorF := FALSE;               (* No connection flag on screen.         *)
  234.   ItClk_active := FALSE;            (* Clock interrupt is NOT activated yet. *)
  235.   IF MEM[$0040:$0049]=7 THEN        (* Video RAM segment.                    *)
  236.     seg_ecran := $B000
  237.   ELSE seg_ecran := $B800;
  238.   WITH reg88 DO
  239.   BEGIN                             (* Stores the previous clock interrupt   *)
  240.     ax := $351C;                    (* in use before setting the new one.    *)
  241.     Intr($21,Dos.Registers(reg88));
  242.     OldIntrp1C.Offset := bx;
  243.     OldIntrp1C.Segment := es;
  244.   END;
  245.   NoSound                           (* Speaker initialization...             *)
  246. END.
  247.